// hdu5784
// 题意：
// 给定n(<=2000)个二维空间中(整)点，三点可能共线，求锐角三角形个数。
//
// 题解：
// 这种题目都是从统计角入手，假如我们统计出锐角的个数A, 直角和钝角的
// 个数B，那么答案就是 (A - 2*B) / 3。因为锐角三角形会被三个锐角都算一遍，
// 而直角和钝角只有两个锐角。
//
// 具体做法就是枚举某个点，把其他点按极角序排序，然后用 two pointer 统计
// 锐角以及直角和钝角的个数。
//
#include <iostream>
#include <algorithm>
#include <vector>

int const maxn = 2007;
using ll = long long;

struct point { int x, y; };

std::istream & operator>>(std::istream & is, point & p)
{
	is >> p.x >> p.y;
	return is;
}

point operator-(point const& lhs, point const& rhs)
{
	return {lhs.x - rhs.x, lhs.y - rhs.y};
}

point points[maxn];
int n;

ll dot(point const& a, point const& b)
{
	return (ll)(a.x) * b.x + (ll)(a.y) * b.y;
}

ll det(point const& a, point const& b)
{
	return (ll)(a.x) * b.y - (ll)(a.y) * b.x;
}

ll calc()
{
	ll acute = 0, right_obtuse = 0;
	std::vector<point> v;
	for (int core = 0; core < n; core++) {
		v.clear();
		for (int i = 0;i < n; i++)
			if (i != core) v.emplace_back(points[i] - points[core]);

		std::sort(v.begin(), v.end(), [](point const& a, point const& b) {
					// polar cmp
					if ((ll)(a.y) * b.y <= 0) {
						if (a.y > 0 || b.y > 0) return a.y < b.y;
						if (!a.y && !b.y) return a.x < b.x;
					}
					return det(a, b) > 0;
				});

		v.insert(v.end(), v.begin(), v.end());
		for (int i = 0, j = 0, k = 0, r = 0; i < n - 1; i++) {
			while (j < n + i - 1 && !det(v[i], v[j]) && dot(v[i], v[j]) > 0) j++;
			k = std::max(k, j);
			while (k < n + i - 1 && det(v[i], v[k]) > 0 && dot(v[i], v[k]) > 0) k++;
			r = std::max(r, k);
			while (r < n + i - 1 && det(v[i], v[r]) > 0) r++;
			acute += k - j;
			right_obtuse += r - k;
		}
	}
	return (acute - 2 * right_obtuse) / 3;
}

int main()
{
	std::ios_base::sync_with_stdio(false);
	while (std::cin >> n) {
		for (int i = 0; i < n; i++) std::cin >> points[i];
		std::cout << calc() << "\n";
	}
}

